package com.cskaoyan.javase.oop1._11static._4exercise;

/**
 * Debug模式查看类加载的过程
 * 在类加载过程中,实际上JVM也会调用一个方法
 * 在idea方法的栈帧中,就是<clinit>方法栈帧
 * 这个方法是JVM把在类加载过程中会执行的语句,封装成了一个方法,然后执行
 *
 * 类加载是可以连环触发的,因为类加载是懒加载,只要第一次碰到了类加载的时机,就一定会类加载该类
 * 类加载的连环触发,表现在内存中,就是各个类的<clinit>方法栈帧
 * 根据栈的先进后出特点
 * 先开始类加载的类,反而最后完成类加载
 * 后开始类加载的类,反而先完成类加载
 *
 * @since 11:31
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Test {
    public static void main(String[] args) {
        /*
            这里会创建A的对象,会触发A类的类加载
            在A类类加载的过程中,会从上到下执行静态成员变量的显式赋值
         */
        A a = new A();
    }
}

class A {
    // 基本数据类型静态成员变量的显式赋值
    static int num = 100;

    // 引用数据类型静态成员变量的显式赋值
    static B b = new B();

    public A() {
        System.out.println("A的无参构造器");
    }
}

class B {
    static int num = 200;

    public B() {
        System.out.println("B类无参构造器");
    }
}